package br.edu.ufcg.msnlab2.grupo02;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import mfc.field.Complex;

import org.junit.Test;

import br.edu.ufcg.msnlab2.grupo02.booleSimpson.Simpsons38Rule;
import br.edu.ufcg.msnlab2.grupo02.booleSimpson.SimpsonsAdaptativeRule;
import br.edu.ufcg.msnlab2.grupo02.booleSimpson.SimpsonsAlternativeExtendedRule;
import br.edu.ufcg.msnlab2.grupo02.booleSimpson.SimpsonsCompositeRule;
import br.edu.ufcg.msnlab2.grupo02.booleSimpson.SimpsonsRule;
import br.edu.ufcg.msnlab2.misc.Function;
import br.edu.ufcg.msnlab2.misc.NumericalIntegrationMethod;
import br.edu.ufcg.msnlab2.misc.Point;

//@SuppressWarnings("boxing")
//public class NumericalIntegrationMethodsTest {
//
//	abstract class FunctionAdapter implements Function {
//
//		@Override
//		public Function derivative() {
//			return null;
//		}
//
//		@Override
//		public Function derivativeY() {
//			// TODO Auto-generated method stub
//			return null;
//		}
//		
//		@Override
//		public abstract double evaluate( double value );
//
//		@Override
//		public Complex evaluate( Complex value ) {
//			return null;
//		}
//
//		@Override
//		public double evaluate( double x, double y ) {
//			return 0;
//		}
//
//		@Override
//		public String getExpression() {
//			return null;
//		}
//
//		@Override
//		public List<Point> getPoints() {
//			return null;
//		}
//
//		@Override
//		public List<Point> getPoints( double min, double max, double step ) {
//			return null;
//		}
//
//	}
//
//	Function fx = new Function() {
//
//		@Override
//		public double evaluate( double value ) {
//			return value;
//		}
//
//	};
//
//	Function fx2 = new Function() {
//
//		@Override
//		public double evaluate( double value ) {
//			return value * value;
//		}
//
//	};
//
//	Function fx3 = new Function() {
//
//		@Override
//		public double evaluate( double value ) {
//			return value * value * value;
//		}
//
//	};
//	
//	Function flogx = new Function() {
//
//		@Override
//		public double evaluate( double value ) {
//			return Math.log( value );
//		}
//
//	};
//
//	Function fex = new Function() {
//
//		@Override
//		public double evaluate( double value ) {
//			return Math.pow( Math.E, value );
//		}
//
//	};
//
//
//	@Test
//	public void basicIntegrationTest() {
//
//		List<NumericalIntegrationMethod> numericalIntegrationMethods = new ArrayList<NumericalIntegrationMethod>();
//		numericalIntegrationMethods.add( new SimpsonsRule() );
//		numericalIntegrationMethods.add( new Simpsons38Rule() );
//		numericalIntegrationMethods.add( new SimpsonsCompositeRule() );
//		numericalIntegrationMethods.add( new SimpsonsAlternativeExtendedRule() );
//		numericalIntegrationMethods.add( new SimpsonsAdaptativeRule() );
//
//		for ( NumericalIntegrationMethod numericalIntegrationMethod : numericalIntegrationMethods ) {
//			String methodName = numericalIntegrationMethod.getClass().getName();
//			for ( int l = 0; l < 1000; l++ ) {
//				double a = l / 100;
//				for ( int m = 0; l < 1000; l++ ) {
//					double b = m / 100;
//					assertEquals( "The " + methodName + " method is not integrating correcly f(x)=x within the interval [" + a + "," + b + "]", Math.abs( ( a + b ) / 2 ), numericalIntegrationMethod.integrate( fx, -1, 0 ) );
//				}
//			}
//
//			double a = -1;
//			double b = 0;
//			assertEquals( "The " + methodName + " method is not integrating correcly f(x)=x^2 within the interval [" + a + "," + b + "]", 1.0 / 3, numericalIntegrationMethod.integrate( fx2, a, b ) );
//			a = 0;
//			b = 1;
//			assertEquals( "The " + methodName + " method is not integrating correcly f(x)=x^2 within the interval [" + a + "," + b + "]", 1.0 / 3, numericalIntegrationMethod.integrate( fx2, a, b ) );
//		}
//
//	}

//}
